import axios from 'axios';
import { v4 as uuidv4 } from 'uuid';

// API基础URL
const NODE_API_BASE_URL = import.meta.env.VITE_NODE_API_BASE_URL;

// 创建axios实例 - 移除静态token，改为在拦截器中动态获取
const request = axios.create({
  baseURL: NODE_API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
    // 移除静态Authorization header，改为在拦截器中动态添加
  },
  paramsSerializer: {
    indexes: null
  }
});

// 检查token是否过期
const isTokenExpired = (token: string): boolean => {
  if (!token) return true;

  try {
    // JWT token格式为: header.payload.signature
    const base64Payload = token.split('.')[1];
    const payload = JSON.parse(atob(base64Payload));

    // 检查exp字段 (过期时间，以秒为单位的时间戳)
    return payload.exp ? payload.exp * 1000 < Date.now() : true;
  } catch (error) {
    console.error('Token解析出错:', error);
    return true;
  }
};

// 请求拦截器 - 动态添加token
request.interceptors.request.use(
  async (config) => {
    // 动态获取用户数据和token
    const userDataStr = localStorage.getItem('userData');
    const userData = userDataStr ? JSON.parse(userDataStr) : null;
    const token = userData?.visitor_token;
    const uuid = userData?.visitor_uuid;

    // 如果有token，则需要添加Authorization头部
    if (token && uuid) {
      // 检查token是否过期
      if (isTokenExpired(token)) {
        // console.log('Token已过期，清除所有缓存');

        // 清除localStorage中的所有缓存
        const allKeys = Object.keys(localStorage);
        allKeys.forEach(key => {
          localStorage.removeItem(key);
          // console.log(`已清除缓存: ${key}`);
        });

        // 强制刷新页面
        // console.log('Token已过期，强制刷新页面');
        window.location.reload();

        return Promise.reject(new Error('Token已过期，已清除所有缓存并刷新页面'));
      } else {
        // Token有效，添加Bearer格式的Authorization头部
        config.headers['Authorization'] = `Bearer ${token}`;
      }
    }
    // 如果没有token，请求会正常发送但不携带Authorization头部

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 导入网络错误处理工具
import { handleNetworkError, NetworkErrorType } from '../utils/networkErrorHandler';

// 响应拦截器 - 处理错误
request.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    // 处理授权失败错误
    if (error.response && (error.response.status === 401 || error.response.status === 403)) {
      // console.error('授权失败:', error.response.data);
      console.error('authorization failed');
      // console.log('Token授权失败，清除所有缓存');

      // 清除localStorage中的所有缓存
      // const allKeys = Object.keys(localStorage);
      // allKeys.forEach(key => {
      //   localStorage.removeItem(key);
      //   console.log(`已清除缓存: ${key}`);
      // });

      // // 强制刷新页面
      // console.log('Token授权失败，强制刷新页面');
      // window.location.reload();
    } 
    // 处理网络错误，没有response表示请求没有发送成功
    else if (!error.response) {
      // 检查错误消息中是否包含特定的网络错误标识
      const errorMessage = error.message || '';
      const errorStack = error.stack || '';
      
      // 处理请求超时情况
      if (error.code === 'ECONNABORTED' || errorMessage.includes('timeout')) {
        handleNetworkError(error, NetworkErrorType.REQUEST_TIMEOUT);
      } 
      // 处理网络不可用情况 - 检查更多的网络断开标识
      else if (
        !navigator.onLine || 
        errorMessage.includes('Network Error') || 
        errorMessage.includes('network') || 
        errorMessage.includes('ERR_INTERNET_DISCONNECTED') ||
        errorStack.includes('ERR_INTERNET_DISCONNECTED') ||
        errorMessage.includes('Failed to fetch')
      ) {
        handleNetworkError(error, NetworkErrorType.NETWORK_UNAVAILABLE);
      }
      // 处理其他连接错误
      else {
        handleNetworkError(error, NetworkErrorType.CONNECTION_ERROR);
      }
    }
    
    // 其余错误直接抛出，由业务组件处理toast
    return Promise.reject(error);
  }
);

// 访客API
// const visitorAPI = {
//   // 访客注册
//   register: async (uuid: string) => {
//     try {
//       const response = await request.post('/api/visitor/register', { uuid });
//       return response.data;
//     } catch (error) {
//       console.error('访客注册失败:', error);
//       throw error;
//     }
//   },

//   // 检查访客认证状态
//   checkAuth: () => {
//     const userDataStr = localStorage.getItem('userData');
//     const userData = userDataStr ? JSON.parse(userDataStr) : null;
//     const uuid = userData?.visitor_uuid;
//     const token = userData?.visitor_token;

//     if (!uuid || !token) {
//       return false;
//     }

//     return !isTokenExpired(token);
//   },

//   // 生成新的UUID
//   generateUUID: () => {
//     return uuidv4();
//   }
// };
// visitorAPI
export { request }; 